#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"

using namespace std;

/*
 *
 * 给定两个字符串 s 和 p，找到 s 中所有 p 的 异位词 的子串，返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串（包括相同的字符串）。



示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
 *
 * */

vector<int> findAnagrams(string s, string p) {
    vector<int> ans;

    int mp[27] = {0};
    for (int i = 0; i < p.size(); ++i) {
        ++mp[p[i] - 'a'];
    }

    int w = p.size();
    for (int i = 0; i < s.size(); ++i) {
        int temp[27];
        memcpy(temp, mp, sizeof(mp));
        if (s.size() - i + 1 >= w) {
            //  auto item=s.substr(i,w);
            for (int j = 0; j < w; ++j) {
                --temp[s[i + j] - 'a'];
                if (temp[s[i + j] - 'a'] < 0)
                    goto label;
            }
            ans.push_back(i);
        }
        label:;
    }


    return ans;

}



//力扣那个编译器感觉不太一样直接越界 todo
//vector<int> findAnagrams(string s, string p) {
//    vector<int> ans;
//
//    int mp[27]={0};
//    for (int i = 0; i <p.size() ; ++i) {
//        ++mp[p[i]-'a'];
//    }
//
//    int w=p.size();
//    for (int i = 0; i <s.size() ; ++i) {
//        int temp[27];
//        memcpy(temp,mp, sizeof(mp));
//        if (s.size()-i+1>=w)
//        {
//            //  auto item=s.substr(i,w);
//            for (int j = 0; j < w; ++j) {
//                int index=s[i+j]-'a';
//                if(index>=0){
//                    --temp[s[i+j]-'a'];
//                    if (temp[s[i+j]-'a']<0)
//                        goto label;
//                }else
//                    goto label;
//            }
//            ans.push_back(i);
//        }
//        label:;
//    }
//
//
//
//    return ans;
//
//}